package mc

import (
	"fmt"
)

type ModelController struct {
	Controller
}

// 初始化控制器
func (ctrl *ModelController) Initialize(c *Context, self IController) {
	ctrl.Controller.Initialize(c, self)
	ctrl.Self.ModelInitializeBefore() // 模型初始化之前
	// 根据请求参数自动初始化model
	if c.ModelName == "" {
		c.ModelName = fmt.Sprintf("%s_%s", c.ModuleName, c.ControllerName)
	}
	ctrl.Model = NewModel(ctrl.Context, ctrl.Context.ModelName)
	ctrl.ModelPage = ctrl.Model.GetPage(c.ActionName, true)
	ctrl.Context.Assign.Model = ctrl.Model
	ctrl.Context.Assign.ModelPage = ctrl.ModelPage

	ctrl.Self.ModelInitializeAfter() // 模型初始化之后
}

func (ctrl *ModelController) GetPageActionName() string {
	return ctrl.ModelPage.UseAction
}


// 列表操作
func (ctrl *ModelController) ListAct() {
	if ctrl.Context.Request.Method == "GET" {
		ctrl.Self.ModelListRenderBefore()
		if ctrl.ModelPage.SearchPage != nil {
			if ctrl.ModelPage.SearchPage.Data == nil {
				ctrl.ModelPage.SearchPage.Data = UrlValueToRequestValue(ctrl.Context.Request.Form)
			}
			ctrl.ModelPage.SearchPage.InitValues(ctrl.ModelPage.SearchPage.Data, ctrl.ModelPage.SearchPage.GetRenderUseDefault(true)).InitWidget()
		}
		// 数据查询
		ctrl.Context.AbortWithHtml(nil)
		return
	} else if ctrl.Context.Request.Method == "POST" {
		page, pageSize, _ := ctrl.Context.GetPage()
		// 查询选项
		qo := &QueryOption{
			Page:       page,
			Values:     UrlValueToRequestValue(ctrl.Context.Request.PostForm),
			PageSize:   pageSize,
			Order:      ctrl.Context.GetOrder(),
			TreeIndent: "　　",
		}

		ctrl.Self.ModelListQueryBefore(qo) // 数据查询之前回调

		data, foot, total, err := ctrl.ModelPage.Query(qo)
		if err != nil {
			panic(err)
		}
		// 输出
		result := &Result{
			Data: data,
			Extra: map[string]interface{}{
				option.Response.TotalName: total,
				option.Response.FootName:  foot,
			},
		}
		ctrl.Self.ModelListQueryAfter(result) // 数据查询之后回调
		ctrl.Context.AbortWithSuccess(result)
		return
	}
}

// 添加操作
func (ctrl *ModelController) AddAct() {
	if ctrl.Context.Request.Method == "GET" { //  GET 界面
		ctrl.ModelPage.Data = UrlValueToRequestValue(ctrl.Context.Request.Form)
		ctrl.Self.ModelAddRenderBefore(ctrl.ModelPage.Data) // 添加渲染前回调
		ctrl.ModelPage.InitValues(ctrl.ModelPage.Data, ctrl.ModelPage.GetRenderUseDefault(true)).InitWidget()
		ctrl.Context.AbortWithHtml(nil)
		return
	} else if ctrl.Context.Request.Method == "POST" { // POST 提交
		if ctrl.ModelPage.Data == nil {
			ctrl.ModelPage.Data = UrlValueToRequestValue(ctrl.Context.Request.PostForm)
		}
		ctrl.Self.ModelAddSaveBefore(ctrl.ModelPage.Data) // 保存数据之前回调
		if _, err := ctrl.ModelPage.Add(ctrl.ModelPage.Data, ctrl.Self.ModelEditVerifyAfter); err != nil {
			panic(err)
		} else {
			result := &Result{Message: "数据保存成功", IsInfo: true}
			ctrl.Self.ModelAddSaveAfter(result)
			ctrl.Self.UpdateCache(result)
			ctrl.Context.AbortWithMessage(result)
		}
	}
}

// 编辑操作
func (ctrl *ModelController) EditAct() {
	pkValue := ctrl.ModelPage.GetPkValue(ctrl.Context)
	if ctrl.Context.Request.Method == "GET" { //  GET 界面
		if ctrl.ModelPage.Data == nil {
			if IsEmpty(pkValue) {
				panic(ErrorBadParameter.Copy("请选择一条记录进行操作").Info())
			}
			query := fmt.Sprintf("%s = ?", ctrl.Model.FieldAddAlias(ctrl.Model.config.Table.Pk))
			rowData, exist, err := ctrl.ModelPage.QueryOneOriginal(query, pkValue)
			if err != nil {
				panic(err)
			} else if !exist {
				panic(ErrorBadParameter.Copy("记录未找到").Info())
			}
			ctrl.ModelPage.Data = rowData
		}
		ctrl.Self.ModelEditRenderBefore(ctrl.ModelPage.Data) // 编辑渲染前回调
		ctrl.ModelPage.InitValues(ctrl.ModelPage.Data, ctrl.ModelPage.GetRenderUseDefault(false)).InitWidget()
		ctrl.Context.AbortWithHtml(nil)
		return

	} else if ctrl.Context.Request.Method == "POST" { // POST 提交
		if ctrl.ModelPage.Data == nil {
			ctrl.ModelPage.Data = UrlValueToRequestValue(ctrl.Context.Request.PostForm)
		}
		if IsEmpty(pkValue) {
			panic(ErrorBadParameter.Copy("请选择一条记录进行操作").Info())
		}
		ctrl.Self.ModelEditSaveBefore(ctrl.ModelPage.Data) // 保存数据之前回调
		if _, err := ctrl.ModelPage.SaveByPk(ctrl.ModelPage.Data, ctrl.Self.ModelEditVerifyAfter, pkValue); err != nil {
			panic(err)
		} else {
			result := &Result{Message: "数据保存成功"}
			ctrl.Self.ModelEditSaveAfter(result)
			ctrl.Self.UpdateCache(result)
			ctrl.Context.AbortWithMessage(result)
		}
	}
}

// 删除操作
func (ctrl *ModelController) DelAct() {
	ids := ctrl.Context.PostFormArray("id")
	ctrl.Self.ModelDelBefore(ids)
	if len(ids) <= 0 {
		panic(ErrorBadParameter.Copy("请选择至少一条记录进行操作").Info())
	}

	if _, err := ctrl.Model.DeleteById(ids); err != nil {
		panic(err)
	} else {
		result := &Result{Message: "数据删除成功", IsInfo: true}
		ctrl.Self.ModelDelAfter(result)
		ctrl.Self.UpdateCache(result)
		ctrl.Context.AbortWithMessage(result)
	}
}



